home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 7818 < prev    next >
Encoding:
Internet Message Format  |  1996-08-05  |  5.1 KB

  1. Path: anvil.ugrad.cs.ubc.ca!not-for-mail
  2. From: c2a192@ugrad.cs.ubc.ca (Kazimir Kylheku)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: String Encryption
  5. Date: 27 Feb 1996 09:57:15 -0800
  6. Organization: Computer Science, University of B.C., Vancouver, B.C., Canada
  7. Message-ID: <4gvglrINNiru@anvil.ugrad.cs.ubc.ca>
  8. References: <1996Feb21.101532.15110@es.dupont.com> <1996Feb21.174407.20730@newshost.micro.ti.com> <4ghq1u$sed@hpbblb.bbn.hp.com> <1168@altheim.win-uk.net>
  9. NNTP-Posting-Host: anvil.ugrad.cs.ubc.ca
  10.  
  11. In article <1168@altheim.win-uk.net>,
  12. Brian R. Oldham <broldham@altheim.win-uk.net> wrote:
  13. >In article <4ghq1u$sed@hpbblb.bbn.hp.com>, Matthias Dittrich (matti) writes:
  14. >>brett@racerx.micro.ti.com (Brett L. Huber) wrote:
  15. >>>Malcolm Smart (MALCOLM.SMART@CONOCO.DUPONT.COM) wrote:
  16. >>>> Has anybody out there got any small routines that I can apply to strings 
  17. >>>> which will effectively encrypt them (and decrypt!).  It's not a matter of 
  18. >>>> state security so it doesn't have to be that secure, just make it 
  19. >>>> unreadable.  
  20. >>>
  21. >>>It really depends on what level of "unreadability" you want.  Who are
  22. >>>you protecting the data from?  If you aren't protecting a secret, try
  23. >>>"rot13," which translates A->N, B->O, ... Z->M.
  24. >>>
  25. >>>For an introduction to cryptographic techniques, try the sci.crypt FAQ:
  26. >>>http://www.cis.ohio-state.edu/hypertext/faq/bngusenet/sci/crypt/top.html
  27. >>>
  28. >>> ...
  29. >>You also can use the crypt() function (see man 3 crypt).
  30. >>
  31. >>Good luck,
  32. >>Matthias
  33. >>
  34. >Thanks for this information. But for those who like me have only
  35. >mail & news (no web access) it is helpful to find information here.
  36. >
  37. >To comply with Malcolm's caveat, that the encryption routine should
  38. >be a simple one I have found this effective:
  39. >
  40. >for(i=0; i<strlen(buffer); i++)
  41. >    str[i] = ~buffer[i];     /* note the ~ operator */
  42. >
  43. >The ~ operator flips all bits in each byte read rendering the text in
  44. >str unreadable.  Use the same operation to reverse it. 
  45.  
  46. Users who are sophisticated enough to peruse executables with hex viewers are
  47. likely to be able to crack that easily. All you have to do is XOR the entire
  48. file with all 1's, and then look for readable strings.
  49.  
  50. A better thing would be to at least use a key:
  51.  
  52. unsigned char *p, *q;
  53. for(p=buffer,q=key;*p;p++,q++) {
  54.     if(!*q)            /* end of key reached---rewind!        */
  55.         q = key;
  56.     *p = (*p * *q) % 131;    /* mult mod prime is invertible        */
  57. }
  58.  
  59. This assumes that all characters involved are unsigned, and less than 131.
  60. The characters of the buffer are multiplied by the characters of the key.
  61. Since the characters in the key and message are less than 131, they are both
  62. relatively prime to 131. Thus the multiplication is invertible.
  63.  
  64. To find the inverse function, you have to do a little math:
  65.  
  66.     C    _= KM (mod P)    (cipher is congruent to key * msg modulo prime)
  67.  
  68. Given K and C, what is M? To do this, you find the modulo P inverse of K (let's
  69. call it L), and multiply both sides:
  70.  
  71.     LC    _= LKM (mod P)
  72.     LC    _= M (mod P)
  73.  
  74. Thus the plaintext is just the product of the inverse and the cipher. You can
  75. precompute the inverses in another array, called "key2", and use the same
  76. function to decrypt (but pass the decrypting key as a parameter).
  77.  
  78. This scheme is equivalent to a simple substitution cipher, except instead of a
  79. translate table, you have the more restrictive modulo multiplication (which
  80. cannot represent all possible mappings).
  81.  
  82. By the way, computing the inverse means solving:
  83.  
  84.     LK    _= 1 (mod P)
  85.  
  86.     LK - 1  -= 0 (mod P)
  87.  
  88.     LK - 1  = Pq     (q is integer)
  89.  
  90.     LK    = Pq + 1
  91.  
  92.     KL - Pq = 1
  93.  
  94. This is a linear diophantine equation that you solve to find integral pairs
  95. (L,q). Since you know that there is a unique L modulo 131, you can do a brute
  96. search by looping over q or L. 
  97.  
  98.     L    = (Pq + 1)/K     < P
  99.  
  100. Suppose that the key for a particular character position is 65 (ascii 'A').
  101. To find the mod 131 inverse, you could just use a brute search for q instead of
  102. bothering to solve the linear diophantine equation.
  103.  
  104. By hand, I can do:
  105.  
  106.     GCD(131,65) = GCD(65,1) = 1
  107.  
  108. Hence, 1 = 131 - 2 * 65,  and thus and L _= -2 (mod 131). In other words,
  109. the inverse is character 129.
  110.  
  111. Let's try the encryption on the character '0', or 48. First, you encrypt:
  112.  
  113. 65 * 48 % 131    =    3120 % 131    = 107    (i.e. 'k')
  114.  
  115. Now we take the ciphertext 107 ('k') and try the inverse:
  116.  
  117. 129 * 107 % 131    =    13803 % 131    = 48.
  118.  
  119. There you have the recovered plaintext.
  120.  
  121.  
  122. This is not secure encryption by any means, but it does have some good
  123. ingredients to thwart prying eyes. First of all, the decryption key looks
  124. quite different from the encryption key, and can be dynamically computed from
  125. the encryption key.  Unless the attacker knows his or her number theory basics,
  126. or can spy on/debug running programs, or can successfully apply some
  127. traditional means for cracking a transposition cipher that uses keys, he will
  128. have a hard time. This is also very easy to implement! The same function
  129. encrypts and decrypts (key[n] * char[n] % prime), and computing the inverses
  130. for the decryption key is a cinch even with a brute force search of all the
  131. congruence classes (other than zero mod 131).
  132.  
  133. The casual Sunday hacker spy armed with a hex editor and a little knowledge 
  134. of bit operations little chance.
  135. -- 
  136.  
  137.